/*
 * COPYRIGHT:	2010 Christopher Smith, licenced under the GNU GPL v2; see COPYING in the top level directory
 * PROJECT:		sdedit
 * FILE:		msgloop.cpp
 * PURPOSE:		main window-message loop
 *				
 */

BOOL PreProcessAccelMessage(MSG *msg, HWND wnd, MSG_PRE_PROCESS_OPTIONS &Ppo)
{
	if(Ppo.AcceleratorTable)
		if(msg->message == WM_KEYDOWN)
			return TranslateAccelerator(wnd, Ppo.AcceleratorTable, msg);
	return FALSE;
 }

BOOL PreProcessMessage(MSG *msg)
{
	MSG_PRE_PROCESS_OPTIONS Ppo;
	RtlZeroStruct(Ppo);

	//ask the window if it wants accelerator processing, assume no
	SendMessage(msg->hwnd, WM_PRE_PROCESS, reinterpret_cast<WPARAM>(&Ppo), reinterpret_cast<LPARAM>(msg));

	if(Ppo.NoDispatch)
		return TRUE;

	if(PreProcessAccelMessage(msg, msg->hwnd, Ppo))
		return TRUE;

	if(!(GetWindowLong(msg->hwnd, GWL_STYLE) & WS_CHILD)) //only child windows recieve dialog messages
		return FALSE;

	HWND Parent = GetParent(msg->hwnd);

	if(!Parent) //sanity check-- all WS_CHILD windows should have a parent
		return FALSE;

	RtlZeroStruct(Ppo);

	//ask the parent if it wants dialog/accelerator processing, assume no
	SendMessage(Parent, WM_PRE_PROCESS, reinterpret_cast<WPARAM>(&Ppo), reinterpret_cast<LPARAM>(msg));

	if(Ppo.NoDispatch)
		return TRUE;

	if(PreProcessAccelMessage(msg, Parent, Ppo))
		return TRUE;

	if(Ppo.ProcessDialog && IsDialogMessage(Parent, msg))
		return TRUE;

	return FALSE;
}

int MessagePump()
{
	BOOL msgret;
	MSG msg;

	while(msgret = GetMessage(&msg, NULL, 0, 0))
	{
		if(!RaiseOnWin32ErrorT(msgret != -1))
			continue;

		if(PreProcessMessage(&msg))
			continue;

		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}
	return 0;
}